GPUs may yield spectacular performance on many important computing applications. However, writing efficient GPU kernels often requires painstaking manual optimization efforts, which are often error prone.